package com.caishi.lkx.user.service;

import com.caishi.lkx.user.model.LoginExpandModel;
import com.caishi.lkx.user.model.LoginInfoModel;
import com.zzw.common.entity.BaseService;
import com.zzw.common.exception.BizException;
import com.caishi.lkx.common.ienum.DeviceType;

import com.caishi.lkx.user.ienum.type.UserAccountType;
import org.springframework.transaction.annotation.Transactional;

import javax.validation.constraints.NotNull;
import java.util.List;

/**
 * @author by keray
 * date:2019/8/1 15:15
 */
public interface ILoginInfoService extends BaseService<LoginInfoModel, String> {


    LoginInfoModel selectLoginInfoUserAccount(String userAccount, UserAccountType type);

    int updateUserUsernameAndPasswordLoginInfo(String userId, String password, String oldPassword) throws BizException;

    /**
     * 根据登录凭证/密码 查询登录信息
     *
     * @return
     */
    LoginInfoModel selectLoginInfoByCredentialsAndAccount(String credentials, String userAccount, UserAccountType type);

    LoginInfoModel selectFirstLoginInfoByCredentials(String credentials, UserAccountType type);

    Boolean checkUsernameExits(String username, String oldUsername);

    String selectUsername(String userId);


    /**
     * 获取用户的所有登录信息
     *
     * @param userId
     * @return
     */
    List<LoginInfoModel> selectUserLoginInfo(String userId);


    /**
     * 获取用户的特定类型登录信息
     *
     * @param userId
     * @param userAccountType
     * @return
     */
    LoginInfoModel selectUserLoginInfo(String userId, UserAccountType userAccountType);


    void updatePassword(String userId, UserAccountType accountType, String newPass);

    /**
     * 登录失败
     * 只有账号+密码登录方式有失败设置
     */
    void loginFail(LoginInfoModel loginInfoModel, DeviceType deviceType, String deviceName);

    /**
     * <p>
     * <h3>作者 keray</h3>
     * <h3>时间： 2019/10/24 11:40</h3>
     * 登录成功
     * </p>
     *
     * @return <p> {@link } </p>
     * @throws
     */
    void loginSuccess(LoginInfoModel loginInfoMode, DeviceType deviceType, String deviceName);

    /**
     * <p>
     * <h3>作者 keray</h3>
     * <h3>时间： 2019/10/24 10:15</h3>
     * 更新用户登录类型
     * </p>
     *
     * @param loginInfoModel
     * @param userId
     * @param type
     * @return <p> {@link } </p>
     * @throws
     */
    void updateLoginInfoByUserIdAndType(LoginInfoModel loginInfoModel, String userId, @NotNull UserAccountType type);

    /**
     * <p>
     * <h3>作者 keray</h3>
     * <h3>时间： 2019/10/24 10:15</h3>
     * 转换用户所有登录启用状态
     * </p>
     *
     * @param userId
     * @param enable
     * @return <p> {@link } </p>
     * @throws
     */
    void changeLoginInfoEnable(String userId, Boolean enable);

    /**
     * <p>
     * <h3>作者 keray</h3>
     * <h3>时间： 2019/12/9 5:52 PM</h3>
     * 用户新增登录方式
     * </p>
     *
     * @param
     * @param userId
     * @return <p> {@link UserModel} </p>
     * @throws BizException
     */
    @Transactional(rollbackFor = Exception.class)
    LoginInfoModel userAddNewLogin(String userAccount, String credentials, UserAccountType type, String userId);

    /**
     * <p>
     * <h3>作者 keray</h3>
     * <h3>时间： 2020/1/4 10:00 AM</h3>
     * 获取用户的登录方式状态
     * 0000 - - - -
     * 0000 qq登录方式 微信登录方式 手机号登录方式 用户名登录方式
     * </p>
     *
     * @param userId
     * @return <p> {@link int} </p>
     * @throws
     */
    int getUserHaveLogin(String userId);

    LoginExpandModel userLastLoginData(String userId);

    void updateAccountByUserId(String userId, String userAccount, UserAccountType type);
}
